package src.main.kotlin.day91


/**
 * 泛型类型检测
 *  泛型参数是什么类型，reified关键字可以帮助检查泛型参数的类型
 *  kotlin不允许对泛型参数T做类型检查，因为泛型参数类型会被类型擦除，
 *  也就是说，T的类型信息在运行时是不可知的，Java也有这样的规则
 */

class MagicBox9<T : Human7>(){

    //随机产生一个对象，如果不是指定类型的对象，就通过backup函数生成一个指定的
    //类型的对象
//    fun <T> randomOrBackup(backup : () -> T) : T{
    inline fun <reified T> randomOrBackup(backup : () -> T) : T{
        val items  = listOf(
            Boy7("jack",20),
            Man7("john",35)
        )
        val random = items.shuffled().first()
        println(random)
        return if (random is T){
            random
        }else{
            backup()
        }
    }
}

open class Human7 (val age : Int)

class Boy7(val name:String,age: Int) : Human7(age){
    override fun toString(): String {
        return "Boy7(name='$name',age='$age')"
    }
}

class Man7(val name:String,age: Int) : Human7(age){
    override fun toString(): String {
        return "Man7(name='$name',age='$age')"
    }
}

fun main() {
    val box1: MagicBox9<Human7> = MagicBox9()
    val randomOrBackup = box1.randomOrBackup {
//        Man7("jimmy", 25)
        Boy7("bobo", 13)
    }

    println(randomOrBackup)

}
